<template>
	<view>
		<button class="button" hover-class="hover" @tap="startSearch" :loading="isScanning">
			搜索蓝牙设备
		</button>
		<text class=".td">（Android8.0+系统需开启定位）</text>
		<scroll-view class="device_list" scroll-y scroll-with-animation>
			<view
				v-for="(item, index) in list"
				:key="index"
				:data-title="item.deviceId"
				:data-name="item.name"
				:data-advertisData="item.advertisServiceUUIDs"
				@tap="bindViewTap"
				class="item"
				hover-class="item_hover"
				v-if="!!item.name"
			>
				<view style="font-size: 16px; color: #333;">{{ item.name }}</view>
				<view style="font-size: 16px; color: #333;">{{ item.deviceId }}</view>
				<view style="font-size: 10px">
					信号强度: {{ item.RSSI }}dBm 
				</view>
			</view>
		</scroll-view>
	</view>
</template>

<script>
// 蓝牙设备连接页面
var app = getApp();

export default {
	data() {
		return {
			list: [], // 蓝牙设备列表
			services: [], // 蓝牙服务列表
			serviceId: 0, // 当前服务索引
			writeCharacter: false, // 是否找到写入特征
			readCharacter: false, // 是否找到读取特征
			notifyCharacter: false, // 是否找到通知特征
			isScanning: false // 是否正在扫描
		};
	},
	/**
	 * 页面加载时初始化
	 */
	onLoad: function(options) {
		// 设置平台信息
		app.globalData.BLEInformation.platform = app.globalData.getPlatform();
	},
	methods: {
		/**
		 * 开始搜索蓝牙设备
		 */
		startSearch: function() {
			var that = this;
			
			// 初始化蓝牙适配器
			uni.openBluetoothAdapter({
				success: function(res) {
					// 检查蓝牙适配器状态
					uni.getBluetoothAdapterState({
						success: function(res) {
							// {
							// 	"discovering": false, // 是否正在搜索设备
							// 	"available": true, // 蓝牙适配器是否可用
							// 	"errMsg": "getBluetoothAdapterState:ok"
							// }
							if (res.available) {
								// 蓝牙可用，开始搜索设备
								if (res.discovering) {
									// 如果正在搜索，先停止
									uni.stopBluetoothDevicesDiscovery();
								}
								that.getBluetoothDevices();
							} else {
								uni.showModal({
									title: "提示",
									content: "本机蓝牙不可用",
									showCancel: false
								});
							}
						}
					});
				},
				fail: function() {
					uni.showModal({
						title: "提示",
						content: "蓝牙初始化失败，请到设置打开蓝牙",
						showCancel: false
					});
				}
			});
		},
		/**
		 * 获取蓝牙设备列表
		 */
		getBluetoothDevices: function() {
			var that = this;
			
			uni.showLoading({
				title: "正在加载",
				icon: "loading"
			});
			
			that.setData({
				isScanning: true
			});
			
			// 开始搜索蓝牙设备
			uni.startBluetoothDevicesDiscovery({
				success: function(res) {
					// 5秒后获取搜索结果
					setTimeout(function() {
						uni.getBluetoothDevices({
							success: function(res) {
								let devicesList = res.devices.filter(i => i.name != '未知设备').filter(i => i.name)
								console.log('== 22 ', devicesList)
								var devices = []; // uuid 对应的的已连接设备列表
								var num = 0;

								// 过滤掉未知设备
								for (var i = 0; i < res.devices.length; ++i) {
									if (res.devices[i].name != "未知设备") {
										devices[num] = res.devices[i];
										num++;
									}
								}

								// 更新设备列表
								that.setData({
									list: devices,
									isScanning: false
								});

								console.log('== 更新设备 ', devices)
								
								uni.hideLoading();
								// 停止搜索
								uni.stopBluetoothDevicesDiscovery();
							}
						});
					}, 2000);
				}
			});
		},
		/**
		 * 点击设备进行连接
		 */
		bindViewTap: function(e) {
			var that = this;
			console.log('== e ', e)
			
			// 停止搜索
			uni.stopBluetoothDevicesDiscovery();
			
			// 重置特征状态
			that.setData({
				serviceId: 0,
				writeCharacter: false,
				readCharacter: false,
				notifyCharacter: false
			});
			
			console.log("连接设备:", e.currentTarget.dataset.title);
			
			uni.showLoading({
				title: "正在连接"
			});
			
			// 创建蓝牙连接
			uni.createBLEConnection({
				deviceId: e.currentTarget.dataset.title,
				success: function(res) {
					console.log("连接成功:", res);
					// 保存设备ID
					app.globalData.BLEInformation.deviceId = e.currentTarget.dataset.title;
					// 获取服务列表
					that.getSeviceId();
				},
				fail: function(e) {
					uni.showModal({
						title: "提示",
						content: "连接失败",
						showCancel: false
					});
					uni.hideLoading();
				}
			});
		},
		/**
		 * 获取蓝牙服务列表
		 */
		getSeviceId: function() {
			var that = this;
			
			// console.log("获取服务列表，设备ID:", app.globalData.BLEInformation.deviceId);
			
			// 延迟1秒后获取服务，确保连接稳定
			setTimeout(() => {
				uni.getBLEDeviceServices({
					deviceId: app.globalData.BLEInformation.deviceId,
					success: function(res) {
						console.log("服务列表:", res);
						that.setData({
							services: res.services
						});
						// 获取特征列表
						that.getCharacteristics();
					},
					fail: function(e) {
						console.log("获取服务失败:", e);
					}
				});
			}, 1000);
		},
		/**
		 * 获取蓝牙特征列表 递归调用 直到拿到为止
		 */
		getCharacteristics: function() {
			var that = this;
			var list = that.services;
			var num = that.serviceId;
			var write = that.writeCharacter;
			var read = that.readCharacter;
			var notify = that.notifyCharacter;
			
			console.log("获取特征列表，服务******:", list[num]);
			
			uni.getBLEDeviceCharacteristics({
				deviceId: app.globalData.BLEInformation.deviceId,
				serviceId: list[num].uuid,
				success: function(res) {
					console.log("特征列表:", res);

					// 遍历当前服务的所有特征值，查找我们需要的读写通知特征
					for (var i = 0; i < res.characteristics.length; ++i) {
						// properties: 特征值的属性，包含 read、write、notify 等权限
						// 例如：{read: true, write: true, notify: false}
						var properties = res.characteristics[i].properties;
						
						// item: 特征值的UUID，用于后续的读写操作
						// 例如："49535343-8841-43F4-A8D4-ECBE34729BB3"
						var item = res.characteristics[i].uuid;

						// 查找通知特征（用于接收打印机返回的数据）
						// !notify: 确保只找到第一个通知特征，避免重复
						// properties.notify: 该特征支持通知功能
						if (!notify && properties.notify) {
							// 保存通知特征的UUID和服务UUID
							app.globalData.BLEInformation.notifyCharaterId = item;
							app.globalData.BLEInformation.notifyServiceId = list[num].uuid;
							notify = true; // 标记已找到通知特征
							console.log("找到通知特征:", item);
						}

						// 查找写入特征（用于发送打印数据给打印机）
						// !write: 确保只找到第一个写入特征，避免重复
						// properties.write: 该特征支持写入功能
						if (!write && properties.write) {
							// 保存写入特征的UUID和服务UUID
							app.globalData.BLEInformation.writeCharaterId = item;
							app.globalData.BLEInformation.writeServiceId = list[num].uuid;
							write = true; // 标记已找到写入特征
							console.log("找到写入特征:", item);
						}

						// 查找读取特征（用于读取打印机状态信息）
						// !read: 确保只找到第一个读取特征，避免重复
						// properties.read: 该特征支持读取功能
						if (!read && properties.read) {
							// 保存读取特征的UUID和服务UUID
							app.globalData.BLEInformation.readCharaterId = item;
							app.globalData.BLEInformation.readServiceId = list[num].uuid;
							read = true; // 标记已找到读取特征
							console.log("找到读取特征:", item);
						}
					}

					// 检查是否找到了所有需要的特征值
					// 如果 write、notify、read 中有任何一个为 false，说明还没找全
					if (!write || !notify || !read) {
						// 准备查找下一个服务
						num++; // 服务索引加1
						
						// 更新当前找到的特征状态
						that.setData({
							writeCharacter: write,   // 是否找到写入特征
							readCharacter: read,     // 是否找到读取特征
							notifyCharacter: notify, // 是否找到通知特征
							serviceId: num           // 下一个要查询的服务索引
						});

						// 检查是否已经查询完所有服务
						if (num == list.length) {
							// 所有服务都查询完毕，但仍未找到所需的特征值
							uni.showModal({
								title: "提示",
								content: "找不到该读写的特征值",
								showCancel: false
							});
							console.log("所有服务查询完毕，未找到所需特征");
						} else {
							// 还有服务未查询，递归调用自己继续查找
							console.log("继续查找下一个服务，索引:", num);
							that.getCharacteristics();
						}
					} else {
						// 找到所有需要的特征，连接成功
						uni.showToast({
							title: "连接成功"
						});
						
						// 打印完整的蓝牙连接信息，用于调试
						console.log("蓝牙连接信息:", app.globalData.BLEInformation);
						console.log("写入特征:", app.globalData.BLEInformation.writeCharaterId);
						console.log("读取特征:", app.globalData.BLEInformation.readCharaterId);
						console.log("通知特征:", app.globalData.BLEInformation.notifyCharaterId);
						
						// 将蓝牙连接信息保存到本地存储
						// 这样下次打开应用时可以直接使用，无需重新连接
						uni.setStorageSync('BLEInformation', app.globalData.BLEInformation);
						
						// 返回上一页
						that.openControl();
					}
				},
				fail: function(e) {
					console.log("获取特征失败:", e);
				}
			});
		},
		/**
		 * 连接成功，返回上一页
		 */
		openControl: function() {
			uni.navigateBack(-1);
		}
	}
};
</script>
<style>
/* 搜索按钮样式 */
.button {
	margin-top: 20px;
	width: 90%;
	background-color: #FFAC60;
	color: white;
	border-radius: 98rpx;
}

/* 按钮按下效果 */
.hover {
	background: #dcdcdc;
}

/* 设备列表容器 */
.device_list {
	height: auto;
	margin: 10px 20px 20px 20px;
	border: 1px solid #eee;
	border-radius: 5px;
	width: auto;
}

/* 提示文字样式 */
.td {
	display: flex;
	align-items: center;
	justify-content: center;
	margin-top: 10px;
}

/* 设备项样式 */
.item {
	display: block;
	border-bottom: 1px solid #eee;
	padding: 4px;
	color: #666;
}

/* 设备项按下效果 */
.item_hover {
	background-color: rgba(0, 0, 0, 0.1);
}
</style>
